package br.com.virtual.cadastrar.dao.impl;

import java.util.ArrayList;
import java.util.List;

import br.com.virtual.base.dao.impl.BaseDaoImpl;
import br.com.virtual.cadastrar.dao.FotoDAO;
import br.com.virtual.cadastrar.model.Foto;
import br.com.virtual.cadastrar.model.Produto;

public class FotoDAOImpl extends BaseDaoImpl implements FotoDAO {

	@Override
	public Foto create(Foto foto) {

		getManager().persist(foto);
		return foto;
	}

	@Override
	public Foto read(Long id) {
		return getManager().find(Foto.class, id);
	}

	@Override
	public void update(Foto foto) {
		getManager().merge(foto);
	}

	@Override
	public void delete(Foto foto) {
		getManager().remove(read(foto.getId()));
	}

	@Override
	public List<Foto> getList(Produto produto) {
		return this.list("f.produto", "produto", produto);
	}

	private List<Foto> list(String paramName, String paramAlias, Object param) {
		return new ArrayList<Foto>(getManager()
				.createQuery(
						"from Foto f where " + paramName + " = :" + paramAlias,
						Foto.class).setParameter(paramAlias, param)
				.getResultList());
	}

	@Override
	public Foto getFirstByProduto(Produto produto) {

		try {
			Foto foto = getManager()
					.createQuery(
							"from Foto f where f.produto = :produto order by f.ordem, f.id",
							Foto.class).setParameter("produto", produto)
					.setMaxResults(1).getSingleResult();

			return foto;

		} catch (Exception e) {
			return null;
		}
	}

	@Override
	public List<Foto> getListNotIn(List<Long> ids) {

		List<Foto> getListNotIn = new ArrayList<Foto>(getManager()
				.createQuery(
						"select f from Foto f where f.id not in (:idFotos)",
						Foto.class).setParameter("idFotos", ids)
				.getResultList());

		return getListNotIn;

	}

	@Override
	public List<Foto> getList() {

		return new ArrayList<Foto>(getManager().createQuery("from Foto f ",
				Foto.class).getResultList());
	}
}
